package br.com.classificadosonline;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import br.com.classificadosonline.nucleo.*;
import br.com.classificadosonline.persistencia.AnuncioDAO;
import br.com.classificadosonline.persistencia.CategoriaDAO;
import br.com.classificadosonline.persistencia.EnderecoDAO;
import br.com.classificadosonline.persistencia.LoginDAO;
import br.com.classificadosonline.persistencia.PessoaDAO;
import br.com.classificadosonline.persistencia.PessoaEnderecoDAO;
import br.com.classificadosonline.persistencia.PlanoDAO;
import br.com.classificadosonline.persistencia.StatusDAO;
import br.com.classificadosonline.persistencia.TipoDAO;

public class Sistema {

	private static final Sistema instance = null;
	
	public static Sistema getInstance() {
		if (instance == null){
		  instance = new Sistema();
		}
		return instance;
	}
	
	private Login usuarioLogado;

	public Sistema() {
		super();
		init();
	}
	
	private void init() {
	}	
	
	public void adicionarPessoa (String bairro, String celular, String CEP, String cidade, String complemento, String cpf,
								 String email, String logradouro, String nome, int numero, String pais, boolean SMS, 
								 String telefone, String uf, String usuario, String senha, String descricaoTipo) {
		cadastrarLogin(usuario, senha);
		Tipo tipo = buscarTipoPorDescricao(descricaoTipo);
		cadastrarEndereco(logradouro, bairro, cidade, uf, pais, numero, complemento, CEP);
		cadastrarPessoa(cpf, nome, telefone, celular, email, SMS, usuario, tipo.getCodigo());
		int codEndereco = buscarEnderecoEspecifico(CEP, numero, complemento).getCodigo();
		buscarPessoa(cpf).setCodEndereco(codEndereco);
		associarPessoaEndereco(codEndereco, cpf);
	}
	
	private static String bytesToHex (byte[] b) {   
        StringBuffer sb = new StringBuffer();   
        for (int i = 0; i < b.length; ++i) {   
            sb.append ((Integer.toHexString((b[i] & 0xFF) | 0x100)).substring(1,3));   
        }   
        return sb.toString();   
    }   
    
	public static String toPassword (String data) throws NoSuchAlgorithmException {   
        byte[] mybytes = data.getBytes();   
        MessageDigest md5 = MessageDigest.getInstance("MD5");   
        byte[] md5digest = md5.digest (mybytes);   
        return bytesToHex (md5digest);   
    } 	
	
	// LOGIN
	public Login buscarLogin(String usuario) {
		return LoginDAO.buscarLogin(usuario);
	}
	
	public void cadastrarLogin(String usuario, String senha) {
		LoginDAO.cadastrarLogin(usuario, senha);
	}
	
	public void excluirLogin(String usuario) {
		LoginDAO.excluirLogin(usuario);
	}
	
	public List<Login> listarLogin() {
		return LoginDAO.listarLogin();
	}
	
	// TIPO
	public Tipo buscarTipoPorCodigo(int codigo) {
		return TipoDAO.buscarTipo(codigo);
	}
	
	public Tipo buscarTipoPorDescricao(String descricao) {
		return TipoDAO.buscarTipoPorDescricao(descricao);
	}
	
	public void cadastrarTipo(String descricao) {
		TipoDAO.cadastrarTipo(descricao);
	}
	
	public void excluirTipo(int codigo) {
		TipoDAO.excluirTipo(codigo);
	}
	
	public List<Tipo> listarTipo() {
		return TipoDAO.listarTipo();
	}
	
	// ENDERECO
	public Endereco buscarEndereco(int codigo) {
		return EnderecoDAO.buscarEndereco(codigo);
	}
	
	public Endereco buscarEnderecoEspecifico(String cep, int numero, String complemento) {
		return EnderecoDAO.buscarEnderecoPorCepPorNumeroPorComplemento(cep, numero, complemento);
	}
	
	public void cadastrarEndereco(String logradouro, String bairro, String cidade, String uf, String pais, int numero, String complemento, String CEP) {
		EnderecoDAO.cadastrarEndereco(logradouro, bairro, cidade, uf, pais, numero, complemento, CEP);
	}
	
	public void excluirEndereco(int codigo) {
		EnderecoDAO.excluirEndereco(codigo);
	}
	
	public List<Endereco> listarEndereco() {
		return EnderecoDAO.listarEndereco();
	}
	
	// PESSOA
	public Pessoa buscarPessoa(String cpf) {
		return PessoaDAO.buscarPessoa(cpf);
	}
	
	public Pessoa buscarPessoaPorUsuario(String usuario) {
		return PessoaDAO.buscarPessoaPorUsuario(usuario);
	}
	
	public void cadastrarPessoa(String cpf, String nome, String telefone, String celular, String email, boolean SMS, String usuario, int codTipo) {
		PessoaDAO.cadastrarPessoa(cpf, nome, telefone, celular, email, SMS, usuario, codTipo);
	}
	
	public void excluirPessoa(String cpf) {
		PessoaDAO.excluirPessoa(cpf);
	}
	
	public List<Pessoa> listarPessoa() {
		return PessoaDAO.listarPessoa();
	}
	
	// PESSOA ENDERECO
	public Integer buscarPessoaEndereco(String cpf) {
		return PessoaEnderecoDAO.buscarEndereco(cpf);
	}
	
	public void associarPessoaEndereco(int codEndereco, String cpf) {
		PessoaEnderecoDAO.cadastrarPessoaEndereco(codEndereco, cpf);
	}
	
	public void excluirEnderecoDePessoa(int codEndereco, String cpf) {
		PessoaEnderecoDAO.excluirEnderecoPessoa(codEndereco, cpf);
	}
	
	public List<Integer> listarPessoaEndereco(String cpf) {
		return PessoaEnderecoDAO.listarPessoaEnderecos(cpf);
	}
	
	// CATEGORIA
	public Categoria buscarCategoria(int codigo) {
		return CategoriaDAO.buscarCategoria(codigo);
	}
	
	public void cadastrarCategoria(String descricao, String foto) {
		CategoriaDAO.cadastrarCategoria(descricao, foto);
	}
	
	public void excluirCategoria(int codigo) {
		CategoriaDAO.excluirCategoria(codigo);
	}
	
	public List<Categoria> listarCategoria() {
		return CategoriaDAO.listarCategoria();
	}	
	
	public void modificarCategoria(int codigo, String descricao, String foto) {
		CategoriaDAO.modificarCategoria(codigo, descricao, foto);
	}
	
	// PLANO
	public Plano buscarPlano(int codigo) {
		return PlanoDAO.buscarPlano(codigo);
	}
	
	public void cadastrarPlano(float valor, String nome, int dias) {
		PlanoDAO.cadastrarPlano(valor, nome, dias);
	}
	
	public void excluirPlano(int codigo) {
		PlanoDAO.excluirPlano(codigo);
	}
	
	public List<Plano> listarPlano() {
		return PlanoDAO.listarPlano();
	}	
	
	public void modificarPlano(int codigo, float valor, String nome, int dias) {
		PlanoDAO.modificarPlano(codigo, valor, nome, dias);
	}
	// STATUS
	public Status buscarStatus(int codigo) {
		return  StatusDAO.buscarStatus(codigo);
	}
	
	public void cadastrarStatus(String descricao) {
		StatusDAO.cadastrarStatus(descricao);
	}
	
	public void excluirStatus(int codigo) {
		StatusDAO.excluirStatus(codigo);
	}
	
	public List<Status> listarStatus() {
		return StatusDAO.listarStatus();
	}

	
	public void modificarStatus(int codigo, String descricao) {
		StatusDAO.modificarStatus(codigo, descricao);
	}
	
	
	public void login(Login usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}
	

	public Login getUsuarioLogado() {
		return usuarioLogado;
	}	
	
	public void logout() {
		usuarioLogado = null;
	}


	// ANUNCIO 
	public Anuncio buscarAnuncio(int codigo) {
		return AnuncioDAO.buscarAnuncio(codigo);
	}
	
	public List<Anuncio> buscarAnunciosPorConteudo(String conteudo) {
		return AnuncioDAO.buscarAnunciosPorConteudo(conteudo);
	}
	
	public List<Anuncio> buscarAnunciosPorConteudoPorCategoria(String conteudo, int codCategoria) {
		return AnuncioDAO.buscarAnunciosPorConteudoAndCategoria(conteudo, codCategoria);
	}
	
	public void cadastrarAnuncio(String dataCadastro, String dataInicio, String dataFim, String conteudo, int numBoleto, int codStatus, int codPlano, int codCategoria, String cpf) {
		AnuncioDAO.cadastrarAnuncio(dataCadastro, dataInicio, dataFim, conteudo, numBoleto, codStatus, codPlano, codCategoria, cpf);
	}
	
	public void excluirAnuncio(int codigo) {
		AnuncioDAO.excluirAnuncio(codigo);
	}
		
	public List<Anuncio> listarAnunciosPorCategoria (int codCategoria) {
		return AnuncioDAO.buscarAnunciosPorCategoria(codCategoria);
	}
	
	public List<Anuncio> listarAnuncio() {
		return AnuncioDAO.listarAnuncio();
	}
	
	public void modificarAnuncio (int codigo, String dataCadastro, String dataInicio, String dataFim, String conteudo, int numBoleto, int codStatus, int codPlano, int codCategoria, String cpf) {
		AnuncioDAO.modificarAnuncio(codigo, dataInicio, dataFim, conteudo, numBoleto, codStatus, codPlano, codCategoria, cpf);
	}

}



